const bar = () => {
  console.log('run bar')
  return 'bar'
}
function * foo () {
  console.log('start')

  try {
    const res = yield bar()
    console.log(res) // get result2
  } catch (e) {
    console.log(e)
  }
}

// 生成器函数执行返回一个遍历器对象
// const generator = foo()
// 调用遍历器对象执行生成器函数函数体内容，遇到yield暂停，返回yield后面的值和done标识生成器是否结束;若yield后面的值是函数会执行该函数，并返回该函数的返回值
// const result1 = generator.next('get result1')
// console.log(result1) // { value: 'bar', done: false }

// // 继续调用next从上次yield暂停的地方继续向下执行,next方法传入的值会作为yield的返回值
// const result2 = generator.next('get result2')
// console.log(result2) // { value: undefined, done: true }

// 调用throw方法会抛出一个异常，可以在生成器函数内捕获到此异常
// const result3 = generator.throw(new Error('generator error'))
// console.log(result3) // { value: undefined, done: true }


// ==================================
// generator函数内的return语句表示结束执行，return后面的函数体不再执行
function * baz () {
  yield 'hello'
  yield 'world'
  console.log('world')
  return 'ending'
  console.log('ending')
  yield 'ending 222'
}

const generator = baz()
const r1 = generator.next()
console.log(r1) // { value: 'hello', done: false }
const r2 = generator.next()
console.log(r2) // { value: 'world', done: false }
const r3 = generator.next()
console.log(r3) // { value: 'ending', done: true }
const r4 = generator.next()
console.log(r4) // { value: undefined, done: true }

